218. Go GUI套件 fyne筆記

緣由

因為Line的貼圖太多了,
關鍵字跑出來的貼圖,常常又不是自己想要的。
所以我就想要搞像MSN那樣的自訂關鍵字,
至少能夠比較快找到我要的貼圖。

主題

  1. Demo
go install fyne.io/fyne/v2/cmd/fyne_demo@latest
fyne_demo
  1. 基本觀念
    參考 軒脈刃de刀光劍影

  2. 主視窗

func main() {
	myApp := app.New()
	myWindow := myApp.NewWindow("Line Sticker Alias")
	// 設定視窗的初始大小
	myWindow.Resize(fyne.NewSize(800, 600))
	// 設定視窗的內容
	myWindow.SetContent(CreateUI(myWindow))
	// 顯示視窗
	myWindow.ShowAndRun()
}
  1. 傳入型態
    傳入建議使用 fyne.Window,因很多UI行為需要的都是window。
    如果要開新視窗的話,可以採用下面的程式
func ShowAliasWindow(filePath string, parent fyne.Window) {
	w := fyne.CurrentApp().NewWindow("新增別名")
	....
}
  1. 常用選項,按鈕(紅色)、文字方塊(紫色)、圖片(綠色)
    218-fig.1.png
// 延遲200ms,啟動按鈕(看起來比較流暢)
aliasButton := widget.NewButton(alias, func() {
  time.AfterFunc(200*time.Millisecond, func() {
    ShowAliasWindow(fulPath, parent)
  })
})

// 文字框
textbox := widget.NewEntry()
textbox.SetPlaceHolder("Enter Keyword...")

// 圖片
img := canvas.NewImageFromFile(fulPath)
img.FillMode = canvas.ImageFillOriginal

  1. 物件合併
    V:vertical
    H:horizontal
// 上面 4. 的 aliasButton 跟 img 合併在一起
images = append(images, container.NewVBox(img, aliasButton))
// 將圖片按鈕物件,切成三個一行
grid := container.NewGridWithColumns(3, images...)

//塞入window,顯示。w 為 上面 3 的宣告
w.SetContent(container.NewVScroll(grid))
w.Resize(fyne.NewSize(400, 400))
w.Show()
  1. dialog

// w 為 fyne.window

// 錯誤對話方塊
err := deleteAlias(stickerId)
if err != nil {
  dialog.NewError(err, w).Show()
  return // 錯誤發生後,直接返回,停止繼續執行下面的程式碼
}
//訊息對話方塊
dialog.NewInformation("提示", "新增完成!", w).Show()

//開啟資料夾對話方塊
dialog.NewFolderOpen(func(folder fyne.ListableURI, err error) {
  if err != nil {
    dialog.ShowError(err, w)
    return
  }
  if folder == nil {
    return // 使用者按取消
  }
  inputFolder.SetText(folder.Path())
}, w).Show()

ref.